package cc.smarnet.caihou.util;

/**
 * @author OceanStar
 * @create 2023-03-21 21:13
 */
import android.graphics.Color;
import android.graphics.Matrix;

import com.github.mikephil.charting.charts.BarChart;
import com.github.mikephil.charting.charts.Chart;
import com.github.mikephil.charting.components.Description;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.BarData;
import com.github.mikephil.charting.data.BarDataSet;
import com.github.mikephil.charting.data.BarEntry;
import com.github.mikephil.charting.formatter.ValueFormatter;

import java.text.DecimalFormat;
import java.util.List;

/**
 * 柱状图
 */
public class BarChartUtils {
    /**
     * 初始化
     *
     * @param chart
     * @return
     */
    public static BarChart initChart(BarChart chart, boolean isXEnbale, boolean isLeftYEnable, boolean isRightYEnable) {
        chart.setDrawGridBackground(false);
        chart.setDrawBorders(false);
        chart.setDragEnabled(true);
        chart.setScaleEnabled(false);
        chart.setTouchEnabled(true);
        chart.animateX(1500);
        chart.setDoubleTapToZoomEnabled(false);
        chart.setPinchZoom(false);
        Description description = chart.getDescription();
        description.setEnabled(true);
        chart.setDescription(description);
        chart.setDragDecelerationEnabled(false);
        chart.setDragDecelerationFrictionCoef(1f);
        //        chart.setMaxVisibleValueCount();
        chart.setDrawBarShadow(false);

        // 不显示图例
        Legend legend = chart.getLegend();
        legend.setEnabled(false);
        chart.setNoDataTextColor(Color.parseColor("#999999"));
        chart.setNoDataText("没有数据");
        initLineChart(chart, isXEnbale, isLeftYEnable, isRightYEnable);
        chart.invalidate();
        return chart;
    }

    /**
     * 初始化xy轴
     *
     * @param chart
     */
    public static void initLineChart(BarChart chart, boolean isXEnbale, boolean isLeftYEnable, boolean isRightYEnable) {
        setXAxisBasic(chart, isXEnbale);
        setLeftYAxisBasic(chart, isLeftYEnable);
        setRightYAxisBasic(chart, isRightYEnable);
    }

    /**
     * x轴基础设置
     *
     * @param chart
     * @param isEnable 设置x轴启用或禁用
     */
    public static void setXAxisBasic(BarChart chart, boolean isEnable) {
        //得到x轴
        XAxis xAxis = chart.getXAxis();
        //是否调用x轴
        xAxis.setEnabled(isEnable);
        xAxis.setDrawAxisLine(true);//是否绘制x轴的直线
        xAxis.setDrawGridLines(true);//是否画网格线

        xAxis.setGridColor(Color.GRAY);
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);// 设置x轴数据的位置
        xAxis.setTextSize(16);//设置轴标签字体大小
        xAxis.setTextColor(Color.BLACK);//设置轴标签字体的颜色

        xAxis.setAvoidFirstLastClipping(true);//图表将避免第一个和最后一个标签条目被减掉在图表或屏幕的边缘
        //设置竖线的显示样式为虚线  lineLength控制虚线段的长度  spaceLength控制线之间的空间
        xAxis.enableGridDashedLine(10f, 10f, 0f);
        xAxis.enableAxisLineDashedLine(10f, 10f, 0f);


        YAxis yAxis = chart.getAxisLeft();
        yAxis.setEnabled(true);
        yAxis.setDrawAxisLine(true);
        yAxis.setDrawGridLines(true);//是否画网格线
        yAxis.setGridColor(Color.GRAY);
        yAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);
        yAxis.setTextSize(16);//设置轴标签字体大小
        yAxis.setTextColor(Color.BLACK);//设置轴标签字体的颜色
        yAxis.enableAxisLineDashedLine(12f, 12f, 2f);
        //设置竖线的显示样式为虚线  lineLength控制虚线段的长度  spaceLength控制线之间的空间
        yAxis.enableGridDashedLine(10f, 10f, 2f);
    }

    /**
     * 左侧y轴基础设置
     *
     * @param chart
     * @param isEnable
     */
    public static void setLeftYAxisBasic(BarChart chart, boolean isEnable) {
        //不显示y轴左边的值
        chart.getAxisLeft().setEnabled(true);

    }

    /**
     * 右侧y轴基础设置
     *
     * @param chart
     * @param isEnable
     */
    public static void setRightYAxisBasic(BarChart chart, boolean isEnable) {
        // 不显示y轴右边的值
        chart.getAxisRight().setEnabled(false);

    }

    /**
     * x轴在点击切换后重新设置的值
     *
     * @param chart
     * @param labelCount
     * @param maximum
     * @param xRangeMaximum
     */
    public static void setXAxis(BarChart chart, int labelCount, float maximum, int xRangeMaximum) {
        chart.setScaleMinima(1.0f, 1.0f);
        chart.getViewPortHandler().refresh(new Matrix(), chart, true);
        //上面两行必须放最上面否则折线间隔失效
        XAxis xAxis = chart.getXAxis();
        xAxis.setLabelCount(labelCount, true);// 设置X轴的刻度数量，第二个参数表示是否平均分配
        xAxis.setAxisMinimum(-1f);
//        xAxis.setAxisMinimum(0f);
//        xAxis.setAxisMaximum(maximum);//设置X轴的值（最小值、最大值、然后会根据设置的刻度数量自动分配刻度显示）
        xAxis.setAxisMaximum(maximum + 1f);//设置X轴的值（最小值、最大值、然后会根据设置的刻度数量自动分配刻度显示）
        xAxis.setGranularity(1f);//设置x轴坐标之间的最小间隔（因为此图有缩放功能，X轴,Y轴可设置可缩放），放在setValueFormatter之前设置
        xAxis.setCenterAxisLabels(false);
        //设置当前图表中最多在x轴坐标线上显示的刻度线总量为6
        chart.setVisibleXRangeMaximum(xRangeMaximum);//这行必须放到下面，和setLabelCount同时设置，值-1
        chart.setScaleEnabled(false);
        chart.setDoubleTapToZoomEnabled(false);
        chart.moveViewToX(-1f);//切换时间时用来将折线图回归到0点
//        chart.moveViewToX(0f);//切换时间时用来将折线图回归到0点
    }


    /**
     * 更新图表
     *
     * @param chart  图表
     * @param values 数据点
     */
    public static void notifyDataSetChanged(BarChart chart, List<BarEntry> values,
                                            List<String> datelist , String barColor) {

        chart.getXAxis().setValueFormatter(new ValueFormatter() {
            @Override
            public String getFormattedValue(float value) {
                if (value < 0) {
                    return "";
                }
                int index = (int) value;
                if (index < 0 || index >= datelist.size()) {
//                    return "" + (int) value;
                    return "";
                }
                return datelist.get(index);
            }
        });
        chart.invalidate();
        setChartData(chart, values, barColor);
    }

    /**
     * 设置图表数据
     *
     * @param chart  图表
     * @param values xy数据集合
     */
    public static void setChartData(BarChart chart, List<BarEntry> values, String barColor) {
        BarDataSet lineDataSet;

        //getDataSetCount() 总线条数,getDataSetByIndex(0) 索引0处的xy数据的集合（30天就是30个 0-29）
        if (chart.getData() != null && chart.getData().getDataSetCount() > 0) {
            lineDataSet = (BarDataSet) chart.getData().getDataSetByIndex(0);
            lineDataSet.setValues(values);
            chart.getData().notifyDataChanged();
            chart.notifyDataSetChanged();
        } else {
            //初始化折线
            lineDataSet = new BarDataSet(values, "");
            //设置多彩
            lineDataSet.setColors(Color.parseColor("#38A45A"), Color.parseColor("#60C981"), Color.parseColor("#82A438"), Color.parseColor("#FFCC00"));
            // 是否显示坐标点的数据，折线上是否绘制数据
            lineDataSet.setDrawValues(true);
            lineDataSet.setValueTextColor(Color.RED);//数据的字体颜色
            lineDataSet.setValueTextSize(18f);//设置显示数据的值的文字大小

            // 不显示定位线，是否禁用点击高亮线
            lineDataSet.setHighlightEnabled(false);
            lineDataSet.setHighLightColor(Color.RED);//设置点击交点后显示交高亮线的颜色

            final DecimalFormat format = new DecimalFormat("###,###,##0");
            lineDataSet.setValueFormatter(new ValueFormatter() {
                @Override
                public String getFormattedValue(float value) {
                    return format.format(value);
                }
            });

            //管理数据集
            BarData data = new BarData(lineDataSet);
            data.setBarWidth(0.5f);
            chart.setFitBars(true);//是否处理超出的柱块（这是个非常重要的属性，有时候可以帮助我们自动处理超出的柱块），一般都会加上
            chart.setData(data);
            chart.invalidate();
        }

    }

    /**
     * 显示无数据的提示
     *
     * @param chart
     */
    public static void NotShowNoDataText(Chart chart) {
        chart.clear();
        chart.notifyDataSetChanged();
        chart.setNoDataTextColor(Color.parseColor("#999999"));
        chart.setNoDataText("没有数据");
        chart.invalidate();
    }
}